home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / SNIP9_91.ARJ / VIO.ASM < prev    next >
Assembly Source File  |  1991-07-02  |  10KB  |  895 lines

  1. ;
  2. ; screen handling primitives
  3. ;
  4. ; by: jim nutt
  5. ;
  6.  
  7. .model large
  8.  
  9. .data
  10.  
  11. vseg    dw      0b000h
  12. vmode   db      ?
  13. x       dw      0
  14. y       dw      0
  15. color   db      07h
  16. ofs     dw      0
  17. xhite   db      8
  18.  
  19. ; video information block
  20.  
  21. VIOinfo struc
  22.     level   db      ?
  23.         db      ?
  24.         dw      ?
  25.     flags   dw      ?
  26.     mode    db      ?
  27.         db      ?
  28.     colors  dw      ?
  29.     pixcol  dw      ?
  30.     pixrow  dw      ?
  31.     txtcol  dw      ?
  32.     txtrow  dw      ?
  33. VIOinfo ends
  34.  
  35. info    VIOinfo <0,0,14,1,0,0,2,0,0,80,25>
  36.  
  37. .code
  38.  
  39. public _VIOopen, _VIOclose, _VIOcolumns, _VIOrows, _VIOmode
  40. public _VIOscrollright, _VIOscrollleft, _VIOscrollup, _VIOscrolldown
  41. public _VIOclear, _VIOputc, _VIOputs, _VIOgetca, _VIOgetra, _VIOheight,
  42. public _VIOsetfore, _VIOsetback, _VIOgetfore, _VIOgetback
  43. public _VIOgotoxy, _VIOupdate, _VIOwherex, _VIOwherey, _VIOputr
  44. public _VIOcursor, _VIOsegment, _VIOsetSegment, _VIOsetRows, _VIOsetCols
  45.  
  46. ;int  _far _pascal VIOheight(void)
  47.  
  48. _VIOheight proc
  49.  
  50.     mov al, xhite;
  51.     xor ah,ah;
  52.     ret
  53.  
  54. _VIOheight endp
  55.  
  56. ;int  _far _pascal VIOopen(void);
  57.  
  58. _VIOopen proc
  59.  
  60.     push ds
  61.  
  62.     mov ax,3000h            ; get dos version, v4 can do this from dos
  63.     int 21h
  64.  
  65.     cmp al,4
  66.     jge odos4
  67.  
  68.     mov ax,0f00h            ; get screen mode and width
  69.     int 10h
  70.  
  71.     mov vmode, al
  72.  
  73.     cmp al,7
  74.     je mono
  75.  
  76.     xor al,al
  77.     xchg al,ah
  78.     mov info.txtcol,ax
  79.     mov vseg,0b800h
  80.  
  81.     push di
  82.     mov ax,0fe00h
  83.     mov es,vseg
  84.     mov di,0
  85.     int 10h
  86.     pop di
  87.     mov vseg,es
  88.  
  89.     push bp                 ; how many rows
  90.     mov ax,1130h
  91.     mov bh,1h
  92.     xor dx,dx
  93.     int 10h
  94.     pop bp
  95.  
  96.     cmp dl,0
  97.     je cga
  98.  
  99.     mov xhite,cl
  100.     inc dl
  101.     xor dh,dh
  102.     mov info.txtrow,dx
  103.  
  104. mono:   mov ax,0
  105.     pop ds
  106.     ret
  107.  
  108. odos4:  mov ax,440ch
  109.     mov bx,0
  110.     mov cx,037fh
  111.     mov dx,offset info
  112.     int 21h
  113.     jnc l1
  114.     pop ds
  115.     ret
  116.  
  117. cga:    mov info.txtrow,25
  118.  
  119. l1:     mov ax,0
  120.     pop ds
  121.     ret
  122.  
  123. _VIOopen endp
  124.  
  125. ;void _far _pascal VIOclose(void);
  126.  
  127. _VIOclose proc
  128.  
  129.     mov ax,3000h
  130.     int 21h
  131.  
  132.     cmp al,4
  133.     jl l2
  134.  
  135.     mov ax,440ch
  136.     mov bx,0
  137.     mov cx,035fh
  138.     mov dx,offset info
  139.     int 21h
  140.  
  141. l2:     ret
  142.  
  143. _VIOclose endp
  144.  
  145. ;int  _far VIOcolumns(void);
  146.  
  147. _VIOcolumns proc
  148.  
  149.     mov ax,info.txtcol
  150.     ret
  151.  
  152. _VIOcolumns endp
  153.  
  154. ;int  _far VIOrows(void);
  155.  
  156. _VIOrows proc
  157.  
  158.     mov ax,info.txtrow
  159.     ret
  160.  
  161. _VIOrows endp
  162.  
  163. ;int  _far VIOmode(void);
  164.  
  165. _VIOmode proc
  166.  
  167.     mov al,vmode
  168.     xor ah,ah
  169.     ret
  170.  
  171. _VIOmode endp
  172.  
  173. ;int  _far VIOwherex(void);
  174.  
  175. _VIOwherex proc
  176.  
  177.     mov ax,x
  178.     ret
  179.  
  180. _VIOwherex endp
  181.  
  182. ;int  _far VIOwherey(void);
  183.  
  184. _VIOwherey proc
  185.  
  186.     mov ax,y
  187.     ret
  188.  
  189. _VIOwherey endp
  190.  
  191. ;void _far VIOscrollright(int x1, int y1, int x2, int y2, int count);
  192.  
  193. _VIOscrollright proc
  194.  
  195.     push bp
  196.     mov bp,sp
  197.     pushf
  198.  
  199.     std
  200.  
  201.     push di
  202.     push si
  203.  
  204.     mov ax,[bp+8]
  205.     mov bx,[bp+12]
  206.     sub bx,ax
  207.     mov cx,info.txtcol
  208.     mul cl
  209.     mov dx,[bp+10]
  210.     add dx,ax
  211.     shl dx,1
  212.     mov cx,[bp+10]
  213.     sub cx,[bp+6]
  214.  
  215.     add bx,2
  216.     mov [bp+6],cx
  217.     mov [bp+8],bx
  218.  
  219.     mov es,vseg
  220.  
  221. sr1:    dec word ptr [bp+8]
  222.     jz sr3
  223.     mov bx,[bp+14]
  224.  
  225.     push ds
  226.     mov ah,color
  227.     mov al,20h
  228.  
  229.     push es
  230.     pop ds
  231.  
  232. sr2:    mov di,dx
  233.     mov si,di
  234.     dec si
  235.     dec si
  236.     mov cx,[bp+6]
  237.     rep movsw
  238.     stosw
  239.     dec bx
  240.     jnz sr2
  241.  
  242.     pop ds
  243.     mov ax,info.txtcol
  244.     shl ax,1
  245.     add dx,ax
  246.     jmp sr1
  247.  
  248. sr3:    pop si
  249.     pop di
  250.  
  251.     popf
  252.     pop bp
  253.     ret
  254.  
  255. _VIOscrollright endp
  256.  
  257. ;void _far VIOscrollleft(int x1, int y1, int x2, int y2, int count);
  258.  
  259. _VIOscrollleft proc
  260.  
  261.     push bp
  262.     mov bp,sp
  263.     pushf
  264.  
  265.     push di
  266.     push si
  267.  
  268.     mov ax,[bp+8]
  269.     mov bx,[bp+12]
  270.     sub bx,ax
  271.     mov cx,info.txtcol
  272.     mul cl
  273.     mov dx,[bp+6]
  274.     add dx,ax
  275.     shl dx,1
  276.     mov cx,[bp+10]
  277.     sub cx,[bp+6]
  278.  
  279.     add bx,2
  280.     mov [bp+6],cx
  281.     mov [bp+8],bx
  282.  
  283.     mov es,vseg
  284.  
  285. sl1:    dec word ptr [bp+8]
  286.     jz sl3
  287.     mov bx,[bp+14]
  288.  
  289.     push ds
  290.     mov ah,color
  291.     mov al,20h
  292.  
  293.     push es
  294.     pop ds
  295.  
  296. sl2:    mov di,dx
  297.     mov si,di
  298.     inc si
  299.     inc si
  300.     mov cx,[bp+6]
  301.     rep movsw
  302.     stosw
  303.     dec bx
  304.     jnz sl2
  305.  
  306.     pop ds
  307.     mov ax,info.txtcol
  308.     shl ax,1
  309.     add dx,ax
  310.     jmp sl1
  311.  
  312. sl3:    pop si
  313.     pop di
  314.  
  315.     popf
  316.     pop bp
  317.     ret
  318.  
  319. _VIOscrollleft endp
  320.  
  321. ;void _far VIOscrollup(int x1, int y1, int x2, int y2, int count);
  322.  
  323. _VIOscrollup proc
  324.  
  325.     push bp
  326.     mov bp,sp
  327.     push di
  328.     push si
  329.  
  330.     mov es,vseg
  331.  
  332.     mov bx,[bp+6]
  333.     mov ax,[bp+8]
  334.     mov dx,info.txtcol
  335.     mul dl
  336.     add ax,bx
  337.     shl ax,1
  338.     shl dx,1
  339.  
  340.     push ax
  341.     push ds
  342.     push ax
  343.  
  344.     mov cx,[bp+10]
  345.     sub cx,bx
  346.     mov bx,cx
  347.  
  348.     mov ax,[bp+12]
  349.     sub ax,[bp+8]
  350.     mov [bp+12],ax
  351.  
  352.     push es
  353.     pop ds
  354.     inc word ptr [bp+14]
  355.  
  356. l9:     dec word ptr [bp+14]
  357.     jz l11
  358.     mov ax,[bp+12]
  359.  
  360. l10:    pop di
  361.     mov si,di
  362.     add si,dx
  363.     push si
  364.     mov cx,bx
  365.     rep movsw
  366.     dec ax
  367.     jne l10
  368.  
  369.     pop di
  370.     pop ds
  371.     mov al,20h
  372.     mov ah,color
  373.     mov cx,bx
  374.     rep stosw
  375.  
  376.     pop di
  377.     push di
  378.     push ds
  379.     push di
  380.  
  381.     push es
  382.     pop ds
  383.     jmp l9
  384.  
  385. l11:    pop ax
  386.     pop ds
  387.     pop ax
  388.     pop si
  389.     pop di
  390.  
  391.     pop bp
  392.     ret
  393.  
  394. _VIOscrollup endp
  395.  
  396. ;void _far VIOscrolldown(int x1, int y1, int x2, int y2, int count);
  397.  
  398. _VIOscrolldown proc
  399.  
  400.     push bp
  401.     mov bp,sp
  402.     push di
  403.     push si
  404.  
  405.     mov es,vseg
  406.  
  407.     mov bx,[bp+6]
  408.     mov ax,[bp+12]
  409.     mov dx,info.txtcol
  410.     mul dl
  411.     add ax,bx
  412.     shl ax,1
  413.     shl dx,1
  414.  
  415.     push ax
  416.     push ds
  417.     push ax
  418.  
  419.     mov cx,[bp+10]
  420.     sub cx,bx
  421.     mov bx,cx
  422.  
  423.     mov ax,[bp+12]
  424.     sub ax,[bp+8]
  425.     mov [bp+12],ax
  426.  
  427.     push es
  428.     pop ds
  429.     inc word ptr [bp+14]
  430.  
  431. l6:     dec word ptr [bp+14]
  432.     jz l7
  433.     mov ax,[bp+12]
  434.  
  435. l8:     pop di
  436.     mov si,di
  437.     sub si,dx
  438.     push si
  439.     mov cx,bx
  440.     rep movsw
  441.     dec ax
  442.     jne l8
  443.  
  444.     pop di
  445.     pop ds
  446.     mov al,20h
  447.     mov ah,color
  448.     mov cx,bx
  449.     rep stosw
  450.  
  451.     pop di
  452.     push di
  453.     push ds
  454.     push di
  455.  
  456.     push es
  457.     pop ds
  458.     jmp l6
  459.  
  460. l7:     pop ax
  461.     pop ds
  462.     pop ax
  463.     pop si
  464.     pop di
  465.     pop bp
  466.     ret
  467.  
  468. _VIOscrolldown endp
  469.  
  470. ;void _far VIOclear(int x1, int y1, int x2, int y2);
  471.  
  472. _VIOclear proc
  473.  
  474.     push bp
  475.     mov bp,sp
  476.     push di
  477.     push si
  478.  
  479.     mov es,vseg
  480.  
  481.     mov ax,[bp+8]
  482.     mov bx,[bp+6]
  483.     mov cx,info.txtcol
  484.     mul cl
  485.     add ax,bx
  486.     shl ax,1
  487.     mov si,ax
  488.     mov bx,[bp+10]
  489.     sub bx,[bp+6]
  490.     inc bx
  491.     mov dx,[bp+12]
  492.     sub dx,[bp+8]
  493.     inc dx
  494.     mov al,20h
  495.     mov ah,color
  496.  
  497. l5:     mov di,si
  498.     mov cx,bx
  499.     rep stosw
  500.     mov cx,info.txtcol
  501.     shl cx,1
  502.     add si,cx
  503.     dec dx
  504.     jne l5
  505.  
  506.     pop si
  507.     pop di
  508.     pop bp
  509.     ret
  510.  
  511. _VIOclear endp
  512.  
  513. ;void _far VIOputc(const char c);
  514.  
  515. _VIOputc proc
  516.  
  517.     push bp
  518.     mov bp,sp
  519.     push di
  520.  
  521.     mov es,vseg
  522.     mov di,ofs
  523.  
  524.     mov ax,[bp+6]
  525.     mov ah,color
  526.  
  527.     stosw
  528.  
  529.     mov ofs,di
  530.     pop di
  531.  
  532.     mov ax,x
  533.     inc ax
  534.     cmp ax,info.txtcol
  535.     jge cwrap
  536.  
  537.     mov x,ax
  538.  
  539.     pop bp
  540.     ret
  541.  
  542. cwrap:  inc y
  543.     sub ax,info.txtcol
  544.     mov x,ax
  545.  
  546.     pop bp
  547.     ret
  548.  
  549. _VIOputc endp
  550.  
  551. ;void _far VIOputs(const char far * s);
  552.  
  553. _VIOputs proc
  554.  
  555.     push bp
  556.     mov bp,sp
  557.     push di
  558.     push ds
  559.  
  560.     mov es,vseg
  561.     mov di,ofs
  562.  
  563.     mov ah,color
  564.     lds si,[bp+6]
  565.     mov bx,x
  566.  
  567. l3:     lodsb
  568.     cmp al,0
  569.     je l4
  570.     stosw
  571.     inc bx
  572.  
  573.     jmp l3
  574.  
  575. l4:     mov ofs,di
  576.     pop ds
  577.     pop di
  578.  
  579.     cmp bx,info.txtcol
  580.     jge swrap
  581.  
  582.     mov x,bx
  583.  
  584.     pop bp
  585.     ret
  586.  
  587. swrap:  inc y
  588.     sub bx,info.txtcol
  589.     mov x,bx
  590.  
  591.     pop bp
  592.     ret
  593.  
  594. _VIOputs endp
  595.  
  596. ;int  _far VIOgetca(const int x, const int y);
  597.  
  598. _VIOgetca proc
  599.  
  600.     push bp
  601.     mov bp,sp
  602.  
  603.     mov es,vseg
  604.     mov ax,[bp+8]
  605.     mov bx,[bp+6]
  606.     mov cx,info.txtcol
  607.     mul cl
  608.     add ax,bx
  609.     shl ax,1
  610.  
  611.     xchg ax,bx
  612.     mov ax,es:[bx]
  613.  
  614.     pop bp
  615.     ret
  616.  
  617. _VIOgetca endp
  618.  
  619. ;int *_far VIOgetra(int x1, int y1, int x2, int y2, int * b);
  620.  
  621. _VIOgetra proc
  622.  
  623.     push bp
  624.     mov bp,sp
  625.     push di
  626.     push si
  627.     push ds
  628.  
  629.     mov ax,[bp+8]           ; y1
  630.     mov bx,info.txtcol
  631.     mul bl                  ; y1 * width of screen
  632.     add ax,[bp+6]
  633.     shl ax,1                ; x1 * 2
  634.     shl bx,1                ; width * 2
  635.     mov cx,[bp+10]
  636.     sub cx,[bp+6]           ; x2 - x1
  637.     mov dx,[bp+12]
  638.     sub dx,[bp+8]           ; y2 - y1
  639.     inc dx
  640.     inc cx
  641.     les di,[bp+14]
  642.     mov ds,vseg
  643.     push cx
  644.  
  645. gr1:    pop cx
  646.     push cx
  647.     mov si,ax
  648.     rep movsw
  649.     add ax,bx
  650.     dec dx
  651.     jnz gr1
  652.  
  653.     pop cx
  654.  
  655.     pop ds
  656.     pop si
  657.     pop di
  658.     pop bp
  659.     ret
  660.  
  661. _VIOgetra endp
  662.  
  663. ;void _far VIOputr(int x, int y, int w, int h, int far * b);
  664.  
  665. _VIOputr proc
  666.  
  667.     push bp
  668.     mov bp,sp
  669.  
  670.     push ds
  671.     push si
  672.     push di
  673.  
  674.     mov ax,[bp+8]
  675.     mov bx,info.txtcol
  676.     mul bl                ; y * width
  677.     add ax,[bp+6]
  678.     shl ax,1
  679.     shl bx,1
  680.  
  681.     mov es,vseg
  682.  
  683.     lds si,[bp+14]
  684.     mov dx,[bp+10]
  685.  
  686. pr1:    mov cx,dx
  687.     mov di,ax
  688.     rep movsw
  689.     add ax,bx
  690.     dec word ptr [bp+12]
  691.     jnz pr1
  692.  
  693.     pop di
  694.     pop si
  695.     pop ds
  696.  
  697.     pop bp
  698.     ret
  699.  
  700. _VIOputr endp
  701.  
  702. ;void _far VIOsetfore(const int c);
  703.  
  704. _VIOsetfore proc
  705.  
  706.     push bp
  707.     mov bp,sp
  708.  
  709.     mov bl,color
  710.     and bx,00f0h
  711.     mov ax,[bp+6]
  712.     and ax,000fh
  713.     or  ax,bx
  714.     mov color,al
  715.  
  716.     pop bp
  717.     ret
  718.  
  719. _VIOsetfore endp
  720.  
  721. ;void _far VIOsetback(const int c);
  722.  
  723. _VIOsetback proc
  724.  
  725.     push bp
  726.     mov bp,sp
  727.  
  728.     mov bl,color
  729.     and bx,000fh
  730.     mov ax,[bp+6]
  731.     and ax,000fh
  732.     shl ax,1
  733.     shl ax,1
  734.     shl ax,1
  735.     shl ax,1
  736.     or  ax,bx
  737.     mov color,al
  738.  
  739.     pop bp
  740.     ret
  741.  
  742. _VIOsetback endp
  743.  
  744. ;int  _far VIOgetfore(void);
  745.  
  746. _VIOgetfore proc
  747.  
  748.     mov al,color
  749.     and ax,000fh
  750.     ret
  751.  
  752. _VIOgetfore endp
  753.  
  754. ;int  _far VIOgetback(void);
  755.  
  756. _VIOgetback proc
  757.  
  758.     mov al,color
  759.     and ax,00f0h
  760.     shr al,1
  761.     shr al,1
  762.     shr al,1
  763.     shr al,1
  764.     ret
  765.  
  766. _VIOgetback endp
  767.  
  768. ;void _far VIOgotoxy(int x, int y);
  769.  
  770. _VIOgotoxy proc
  771.  
  772.     push bp
  773.     mov bp,sp
  774.  
  775.     mov bx,[bp + 6]
  776.     mov ax,[bp + 8]
  777.  
  778.     mov x,bx
  779.     mov y,ax
  780.  
  781.     mov cx,info.txtcol
  782.     mul cl
  783.  
  784.     add ax,bx
  785.     shl ax,1
  786.  
  787.     mov ofs,ax
  788.  
  789.     pop bp
  790.     ret
  791.  
  792. _VIOgotoxy endp
  793.  
  794. ;void _far VIOupdate(int x1, int y1, int x2, int y2);
  795.  
  796. _VIOupdate proc
  797.  
  798.     mov ah,2
  799.     mov bh,0
  800.     mov cx,y
  801.     mov dx,x
  802.     mov dh,cl
  803.     int 10h
  804.  
  805.     ret
  806.  
  807. _VIOupdate endp
  808.  
  809. ;void _far VIOcursor(int _far * x, int _far * y, int _far * shape);
  810.  
  811. _VIOcursor proc
  812.  
  813.     push bp
  814.     mov bp,sp
  815.     push ds
  816.  
  817.     mov ah,3
  818.     mov bh,0
  819.     int 10h
  820.  
  821.     mov al,dl
  822.     cbw
  823.     lds bx,[bp + 6]
  824.     mov [bx],ax
  825.  
  826.     mov al,dh
  827.     cbw
  828.     lds bx,[bp + 10]
  829.     mov [bx],ax
  830.  
  831.     lds bx,[bp + 14]
  832.     mov [bx],cx
  833.  
  834.     pop ds
  835.     pop bp
  836.     ret
  837.  
  838. _VIOcursor endp
  839.  
  840. ;unsigned int  _far VIOsegment(void);
  841.  
  842. _VIOsegment proc
  843.  
  844.     mov ax, vseg
  845.     ret
  846.  
  847. _VIOsegment endp
  848.  
  849. ;void _far VIOsetSegment(unsigned int s);
  850.  
  851. _VIOsetSegment proc
  852.  
  853.     push bp
  854.     mov bp,sp
  855.  
  856.     mov ax, [bp + 6]
  857.     mov vseg,ax
  858.  
  859.     pop bp
  860.     ret
  861.  
  862. _VIOsetSegment endp
  863.  
  864. ;void _far VIOsetRows(int r);
  865.  
  866. _VIOsetRows proc
  867.  
  868.     push bp
  869.     mov bp,sp
  870.  
  871.     mov ax,[bp + 6]
  872.     mov info.txtrow,ax
  873.  
  874.     pop bp
  875.     ret
  876.  
  877. _VIOsetRows endp
  878.  
  879. ;void _far VIOsetCols(int c);
  880.  
  881. _VIOsetCols proc
  882.  
  883.     push bp
  884.     mov bp,sp
  885.  
  886.     mov ax,[bp + 6]
  887.     mov info.txtcol, ax
  888.  
  889.     pop bp
  890.     ret
  891.  
  892. _VIOsetCols endp
  893.  
  894. end
  895.